package org.Yiran.timetale_re.capability;

import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.Yiran.timetale_re.Timetale_re;

/**
 * 符文制作熟练度能力管理类
 * 负责处理符文制作熟练度能力的附加、同步和持久化
 * <p>
 * 主要功能:
 * 1. 为玩家实体附加符文制作熟练度能力
 * 2. 处理玩家重生时的数据保留
 * 3. 管理玩家数据的保存和加载
 */
@Mod.EventBusSubscriber(modid = Timetale_re.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE)
public class RuneCraftingProficiencyCapability {

    // ==================== 资源定位符定义 ====================

    /**
     * 符文制作熟练度能力的资源定位符
     * 用于唯一标识该能力，格式为 域名:能力名称
     */
    public static final ResourceLocation RUNE_PROFICIENCY =
        ResourceLocation.fromNamespaceAndPath(Timetale_re.MODID, "rune_crafting_proficiency");

    // ==================== 能力附加事件处理 ====================

    /**
     * 当实体附加能力时触发的事件处理方法
     * 为玩家实体附加符文制作熟练度能力
     *
     * @param event 实体附加能力事件
     */
    @SubscribeEvent
    public static void onAttachCapabilities(AttachCapabilitiesEvent<Entity> event) {
        // 只为玩家实体附加能力
        if (event.getObject() instanceof Player player) {
            // 创建能力提供者实例
            RuneCraftingProficiencyProvider provider = new RuneCraftingProficiencyProvider();
            // 设置玩家引用，使能力可以访问玩家对象
            provider.setPlayer(player);
            // 将能力附加到玩家实体上
            event.addCapability(RUNE_PROFICIENCY, provider);
        }
    }

    // ==================== 玩家克隆事件处理 ====================

    /**
     * 当玩家克隆（重生）时触发的事件处理方法
     * 用于在玩家死亡后保留符文制作熟练度数据
     *
     * @param event 玩家克隆事件
     */
    @SubscribeEvent
    public static void onPlayerCloned(PlayerEvent.Clone event) {
        // 只在玩家死亡后保留数据
        if (event.isWasDeath()) {
            // 从原始玩家获取符文制作熟练度能力数据
            event.getOriginal().getCapability(RuneCraftingProficiencyProvider.RUNE_CRAFTING_PROFICIENCY)
                .ifPresent(oldStore ->
                    // 将原始数据复制到新玩家的能力中
                    event.getEntity().getCapability(RuneCraftingProficiencyProvider.RUNE_CRAFTING_PROFICIENCY)
                        .ifPresent(newStore ->
                            // 通过序列化和反序列化完成数据复制
                            newStore.deserializeNBT(oldStore.serializeNBT())
                        )
                );
        }
    }

    // ==================== 玩家数据保存和加载事件处理 ====================

    /**
     * 当玩家数据保存到磁盘时触发的事件处理方法
     * 用于将符文制作熟练度数据保存到玩家的NBT数据中
     *
     * @param event 玩家数据保存事件
     */
    @SubscribeEvent
    public static void onPlayerSave(PlayerEvent.SaveToFile event) {
        // 加载玩家的符文制作熟练度数据
        Player player = event.getEntity();
        player.getCapability(RuneCraftingProficiencyProvider.RUNE_CRAFTING_PROFICIENCY)
                .ifPresent(proficiency -> {
                });
    }

    /**
     * 当玩家数据从磁盘加载时触发的事件处理方法
     * 用于从玩家的NBT数据中恢复符文制作熟练度数据
     *
     * @param event 玩家数据加载事件
     */
    @SubscribeEvent
    public static void onPlayerLoad(PlayerEvent.LoadFromFile event) {
        // 保存玩家的符文制作熟练度数据
        Player player = event.getEntity();
        player.getCapability(RuneCraftingProficiencyProvider.RUNE_CRAFTING_PROFICIENCY)
                .ifPresent(proficiency -> {
                });
    }
}